package ar.edu.unq.model;

/**
 * TODO: description
 */
public class PartidoCopa extends Partido {

    Partido partidoIda;

    Partido partidoVuelta;

    private Equipo equipoGanador;

    public Equipo getEquipoGanador() {
        return this.equipoGanador;
    }

    public void setEquipoGanador(final Equipo equipoGanador) {
        this.equipoGanador = equipoGanador;
    }

    public PartidoCopa() {
    }

    public PartidoCopa(final Equipo equipo1, final Equipo equipo2) {
        super();
        this.partidoIda = new PartidoSimple(equipo1, equipo2);
        this.partidoVuelta = new PartidoSimple(equipo2, equipo1);
        this.jugar();
    }

    @Override
    public Equipo jugar() {
        Equipo ganadorIda = this.partidoIda.jugar();
        Equipo ganadorVuelta = this.partidoVuelta.jugar();

        if (ganadorIda != null && ganadorVuelta == null) {
            this.setEquipoGanador(ganadorIda);
            return ganadorIda;
        }
        if (ganadorIda == null && ganadorVuelta != null) {
            this.setEquipoGanador(ganadorVuelta);
            return ganadorVuelta;
        }
        if (ganadorIda != null && ganadorVuelta != null && ganadorIda == ganadorVuelta) {
            this.calcularGolesEquipo1();
            this.calcularGolesEquipo2();
            if (this.getGolesLocal() == this.getGolesVisitante()) {
                Equipo ganador = this.definicionPorPenales();
                this.setEquipoGanador(ganador);

            } else {
                Equipo ganador = this.getGolesLocal() > this.getGolesVisitante() ? this.getPartidoIda()
                        .getEquipoLocal() : this.getPartidoIda().getEquipoVisitante();
                this.setEquipoGanador(ganador);
            }
        }
        this.setEquipoGanador(ganadorIda);
        return ganadorIda;
    }

    private void calcularGolesEquipo1() {
        this.setGolesLocal(this.partidoIda.getGolesLocal() + this.partidoVuelta.getGolesVisitante());
    }

    private void calcularGolesEquipo2() {
        this.setGolesVisitante((this.partidoIda.getGolesVisitante() + this.partidoVuelta.getGolesLocal()));
    }

    private Equipo definicionPorPenales() {
        if (this.generateRandomInt() % 2 == 0) {
            return this.equipoLocal;
        } else {
            return this.equipoVisitante;
        }
    }

    /**
     * @author Cristian Cejas Devuelve un numero entero entre 0 y 100
     */
    private int generateRandomInt() {
        return (int) Math.round(Math.random() * 100);
    }

    public Partido getPartidoIda() {
        return this.partidoIda;
    }

    public void setPartidoIda(final Partido partidoIda) {
        this.partidoIda = partidoIda;
    }

    public Partido getPartidoVuelta() {
        return this.partidoVuelta;
    }

    public void setPartidoVuelta(final Partido partidoVuelta) {
        this.partidoVuelta = partidoVuelta;
    }
}
